<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title></title>
</head>

<body>
	<input type="file" onchange="importf(this)" />
	<div id="demo"></div>
	<script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/xlsx/0.18.2/xlsx.full.min.js"></script>
	<script>
		/*
		FileReader共有4种读取方法：
		1.readAsArrayBuffer(file)：将文件读取为ArrayBuffer。
		2.readAsBinaryString(file)：将文件读取为二进制字符串
		3.readAsDataURL(file)：将文件读取为Data URL
		4.readAsText(file, [encoding])：将文件读取为文本，encoding缺省值为'UTF-8'
		*/
		// 读取完成的数据
		var wb;
		// 是否将文件读取为二进制字符串
		var rABS = false;
		// 导入
		function importf(obj) {
			if (!obj.files) {
				return;
			}
			var f = obj.files[0];
			var reader = new FileReader();
			reader.onload = function (e) {
				var data = e.target.result;
				if (rABS) {
					// 手动转化
					wb = XLSX.read(btoa(fixdata(data)), {
						type: 'base64'
					});
				} else {
					wb = XLSX.read(data, {
						type: 'binary'
					});
				}
				//wb.SheetNames[0]是获取Sheets中第一个Sheet的名字
				//wb.Sheets[Sheet名]获取第一个Sheet的数据
				let $data = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
				// document.getElementById("demo").innerHTML = JSON.stringify($data);

				console.log($data);
			};
			if (rABS) {
				reader.readAsArrayBuffer(f);
			} else {
				reader.readAsBinaryString(f);
			}
		}

		// 文件流转BinaryString
		function fixdata(data) {
			var o = "",
				l = 0,
				w = 10240;
			for (; l < data.byteLength / w; ++l) {
				o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
			}
			o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
			return o;
		}
	</script>
</body>

</html>